公元2800年,火星移民成功,一个叫做中本聪的人,在上面建立了一个国家,大家拥护他的治国理念,大家过的很快乐,很自由,但是百业待兴,很多规则需要重新制定。
首要的就是交易。交易规则也就自然需要制定,顺着以往的地球经验来当然简单,但是以往的经验也会有他的麻烦。国民也是参差不齐的道德素质,但是十只手指伸出来不一样齐,有人能干,有人则喜欢钻空子。这是一个麻烦,也是一个机会。中本聪想到的是,借此机会破旧立新。
以往的做法,大家都信任银行,确实可以降低交易成本,但是养着银行本身也是一个交易的成本。集中式的服务,如果有了单点故障,甚至数据丢失,那什么账本也都没有了,要是银行本身的人不老实,麻烦就更大。反正都2800年了,人人都有电脑,不如?
干脆大家都记账!每一笔交易,在每个人的账本里面都记录,全分布。每一个电脑都有一个完整的账本,账本包括账户和余额、交易,账户的公钥(私钥肯定只有自己有)。就算某些节点挂了,毕竟全网都有备份,什么时候都可以恢复。
想起来很美的。
- 可信任的第三方。银行之所以可以降低成本就是因为它独立于交易之外,多年的信誉服务,让它可以成为可信的第三方。无论交易的甲方乙方如何看,第三方可以证明交易的实际情况。现在,既然是全分布,那么这个效果的所有人都是第三方,岂不是更加安全可信。即便其中有那么几个人看了人情世故,心软了什么的,做了假证据,只要人数绝对的多,就是可以达成更好的信任和背书。
- 可容错。无需担心单点失效。单点的服务,可能失效,可能因为备份的原因导致数据丢失,可能需要更多的维护成本。而全网的记账,即使其中部分电脑服务失效,数据出错,也不影响账本的可信性和可获得性。
- 无需担心篡改。任何一个篡改,要记入账本对必须其他电脑的确认,掌握51%电脑的篡改才能生效
人人为我,我为人人,好像共产主义即将实现。
随即,中本聪发动大脑,开始制定基于分布后的交易规则。
第一个就是如何转账。
比如A转账1个火星币给B。双方就会发出各自一个广播,广播内容为"转账,A到B,1”,所有的国民电脑都开始记账,"转账,A到B,1”到自己的账本内。但是分布式账本,只是账本分布,内容是一致的,为了更好的对账,必须要每个账本条目都有一个唯一ID。如何产生这个ID呢?答案是第一个成功记账的人首先广播到全网,说我已经成功记账,条目"转账,A到B,1”的ID为97SF0,正在记账的其他人就会停止自己当前的记账过程,使用此ID写入自己的账本。
进一步的问题是,万一两个人同时完成记账,并同时完成广播怎么办?办法是,减慢记账的速度以便降低完成记账同时的概率。比如去寻找一个特别大的质数就是一个耗时的工作,多找几个类似的工作,在记账的时候,随机的选择其中一个工作开始做,因此大家的时间几乎必然不同,分出差异来,选出第一个成功记账的就容易了。于是唯一ID也就决定出来了。
要是这样做之后,依然有两个电脑(C和D)同时完成,同时广播ID呢。此问题被称为分叉问题。这时必然是两个ID,必须从中选择出一个来。否则分布式账本就会出现一个交易却两个记录的问题。怎么办?ID广播已经是事实,网络大点的话,也必然会导致一部分电脑用过C的id,一部分使用了D的id。此时重要的是一个id,哪一个却并不重要,规则就是以此id记录的随后的账面条目越多,那么此id就会被选择,没有被选择id的账本以前者为准来全部修改达成一致。
第二个是解决空白转账(double-spending )。比如A有1个火星币,转账1个火星币给B(交易1),但是它同时也说转账一个火星币为C(交易2)。这是不允许的,因为A没有那么多钱。但是如何解决呢。
每个节点上会存在全网所有的区块信息也就是全网的账户信息,来验证该交易的合法性。
两笔交易一前一后到达那肯定没啥好说的,全网任意一个节点都能验证出第二笔为重复支付;
若两笔交易同时达到两个节点中,两个节点同时验证为成功的同时广播到全网,假设交易1被一部分节点记录到账本,交易2被另一部分节点记入账本,此时产生分叉。
所以出现分叉之后,全网电脑不会接受和自己不同的更新,会继续按照自己的区块更新,再之后的几次区块中自然会更新出最长的一条区块来,并且 此最长账本的,至少有5个验证过的block在其分叉点之后,就可以决定出此账本为准确账本。之前的分叉会被拆掉。
所以,空白转账问题,解决的方法是事后的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。